"use client";
import { useState, useEffect } from "react";
import { trpc } from "@/app/_trpc/client";
import { useToast } from "@/components/ui/use-toast";
import useFormHandler from "@/hooks/useFormHandler";
import { z } from "zod";
import { projectAreaSchema } from "@/lib/schemas/projectAreaSchema";
import { Project } from "@/types";
interface AreaFormProps{
project:any,
isEdit?:boolean,
editValues:any
}
const useAreaForm = ({ project, isEdit, editValues }: AreaFormProps) => {
const [open, setOpen] = useState(false);
const utils = trpc.useUtils();
const { toast } = useToast();
const [isCustomArea,setIsCustomArea]=useState<boolean>(false)
const defaultValues: z.infer<typeof projectAreaSchema> = {
width: 0,
length: 0,
floorId: "",
type: "Piso",
projectId: "",
projectName: "",
quantity: 1,
};
const {
form,
isInputChanged,
setIsInputChanged,
setFormValues,
getChangedFields,
} = useFormHandler(projectAreaSchema, defaultValues);
useEffect(() => {
if (open) {
let initialValues = {
projectId: project?.id!,
projectName: project?.name!,
};
if (isEdit && editValues) {
initialValues = { ...initialValues, ...editValues };
}
setFormValues(initialValues);
}
}, [open, project, isEdit, editValues]);
const { mutate: createProjectAreaMutation, isPending: isPendingCreateArea } =
trpc.areas.createProjectArea.useMutation({
onSuccess: () => {
setOpen(false);
toast({ title: "Éxito", description: "Área añadida con éxito" });
setIsInputChanged(false);
utils.projects.getProjectById.invalidate({ value: project?.id! });
},
onError: (opts) => {
toast({ title: "Error", description: opts?.message, variant: "destructive" });
},
});
const { mutate: updateAreaMutation, isPending: isPendingUpdateArea } =
trpc.areas.updateProjectArea.useMutation({
onSuccess: () => {
setOpen(false);
toast({ title: "Éxito", description: "Área modificada con éxito" });
setIsInputChanged(false);
utils.projects.getProjectById.invalidate({ value: editValues?.projectId! });
},
onError: (opts) => {
toast({ title: "Error", description: opts?.message, variant: "destructive" });
},
});
const areaFormValue = form.watch('type')
useEffect(()=>{
if(areaFormValue.toLocaleLowerCase() === 'otro'){
setIsCustomArea(true);
form.setValue('type','')
}
},[areaFormValue,form])
const resetCustomArea=()=>{setIsCustomArea(false)}
const onSubmit = (values: z.infer<typeof projectAreaSchema>) => {
let valuesCreateOrUpdate:any = values;
if (isEdit) {
const changedFields = getChangedFields(values);
valuesCreateOrUpdate = {
id: editValues?.id,
projectId: values.projectId,
projectName: values.projectName,
floorId: values.floorId,
...changedFields,
};
updateAreaMutation(valuesCreateOrUpdate);
return;
}
createProjectAreaMutation(values);
};
return {
open,
setOpen,
form,
isInputChanged,
isPendingCreateArea,
isPendingUpdateArea,
onSubmit,
isCustomArea,
resetCustomArea
};
};
export default useAreaForm;